perm filename ARITH.PAL[HAL,HE]1 blob
sn#121321 filedate 1974-09-24 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00002 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 SQRTF: Floating point square root. Timing: 126 -- 135 microseconds.
C00004 ENDMK
C⊗;
SQRTF: ;Floating point square root. Timing: 126 -- 135 microseconds.
;AC0 ← SQRT(AC0). Clobbers AC1, AC2.
;AC0: argument
;AC1: guess of answer
;AC2: temp arith register
ABSF AC0 ;AC0 ← absolute value
STEXP AC0,R0 ;R0 ← Exponent
INC R0 ;
ASR R0 ;R0 ← (Exponent +1)/ 2
BCS SQR1 ;If fraction ≥ half then branch.
LDF #00234,AC1 ;FRACTION[guess] ← .470 = sqrt(3/2)
BR SQR2 ;
SQR1: LDF #00335,AC1 ;FRACTION[guess] ← .673 = sqrt(3)
SQR2: LDEXP R0,AC1 ;EXP[Guess] ← exponent / 2
MOV #3,R0 ;R0 ← Number of Newton iterations
SQR3: LDF AC0,AC2 ;temp ← arg
DIVF AC1,AC2 ;temp ← arg /guess
ADDF AC1,AC2 ;temp ← (arg/guess)+guess
DIVF #40400,AC2 ;temp ← ((arg/guess)+guess) / 2
STF AC2,AC1 ;new guess ← temp
SOB R0,SQR3 ;Repeat iteration a few times
LDF AC1,AC0 ;AC0 ← answer
RTS PC ;Done